#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<Windows.h>
int main()
{
	//第五讲:数组

	//2.2 数组的初始化:
	//int arr[5] = { 1,2,3,4,5 };//完全初始化
	//int arr[5] = { 1,2,3 };//不完全初始化
	//int arr[5] = { 1,2,3,4,5,6,7 };//错误的初始化


	//2.3 数组的类型:
	//int arr[5];//去掉数组名剩下的就是类型,这个数组的类型就是arr [5]



	//**********************
	//3.一维数组的使用
	//**********************
	//3.1 数组的下标
	//下标从0开始，假设数组中有n个元素，最后一个元素的下标是n-1
	//C语言中数组的访问提供了一个操作符[],这个操作符叫做下标引用操作符
	//有了下标访问操作符就可以轻松访问数组的元素了


	//3.2 数组元素的打印:
	//int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	//for (int i = 0; i < 10; i++)
	//{
	//	printf("%d ", arr[i]);
	//}


	//3.3 数组的输入:
	//int arr[10];
	//for (int i = 0; i < 10; i++)
	//{
	//	scanf("%d", &arr[i]);//arr是数组名自己就是地址，但是arr[i]是数组中的元素不是地址，需要取地址
	//}



	//***********************
	//4.一维数组在内存中的存储
	//***********************
	//int arr[10] = { 0 };
	//for (int i = 0; i < 10; i++)
	//{
	//	printf("&arr[%d] = %p\n",i,&arr[i]);//连续的
	//}

	//***********************
	//5.计算数组元素个数
	//***********************
	//int arr[] = { 1,2,3,4,5,6,7,8,9,10,11 };
	//int sz = sizeof(arr) / sizeof(arr[0]);
	//printf("%d", sz);



	//***************
	//6.二维数组的创建
	//***************
	//6.1 二维数组的概念:
	//把一维数组作为数组元素，这时候就是二维数组.(同样的把二维数组作为数组元素被成为三维数组)


	//6.2 二维数组的创建:
	//int arr[3][5];//三行五列的整型



	//******************
	//7.二维数组的初始化
	//******************
	//int arr[3][5] = { 1,2,3,4,5,6,7 };//（不完全初始化）第一行放完放第二行
	//int arr[3][5] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };//(完全初始化)
	//int arr[3][5] = { {1,2},{3,4},{5,6} };//按行初始化,第一行:1,2 第二行:3,4 第三行:5,6
	//二维数组初始化的时候行可以省略但是列不能省略，一行要知道有多少个才行，因为是从第一行开始放元素，放完自动排到下一行就可以了



	//******************
	//8.二维数组的使用
	//******************
	//8.1 二维数组的下标
	//行和列都是从0开始的


	//8.2 二维数组的输出(输入同理)
	//int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
	//for (int i = 0; i < 3; i++)//控制行
	//{
	//	for (int j = 0; j < 4; j++)//控制列
	//	{
	//		printf("%-3d", arr[i][j]);
	//	}
	//	printf("\n");
	//}



	//***********************
	//9.二维数组在内存中的存储
	//***********************
	//int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
	//for (int i = 0; i < 3; i++)
	//{
	//	for (int j = 0; j < 4; j++)
	//	{
	//		printf("&arr[%d][%d] = %p ", i, j, &arr[i][j]);
	//	}
	//	printf("\n");
	//}
	//二维数组每个元素本质在内存中依然是连续存放
	
	
	
	//***********************
	//10.C99中的变长数组
	//***********************
	//用变量指定数组的大小
	//int n = 0;
	//int arr[n];//在vs2022上不支持,gcc支持，clang支持
	//由于数组长度只有在运能被确定，所行时才以变长数组不支持初始化



	//练习1:
//char arr1[] = "welcome to bit!!!!!";
//char arr2[] = "*******************";
//int left = 0;
//int right = strlen(arr1) - 1;//求下标
//for (left = 0; left <= right; left++,right--)
//{
//	arr2[left] = arr1[left];
//	arr2[right] = arr1[right];
//	printf("%s\r", arr2);//或者把\r换成\t
//	Sleep(500);//休眠-单位是毫秒
//}
//printf("%s\n", arr2);


	//练习2:二分查找
	//int arr[10] = { 0,2,3,4,5,6,7,8,9,10 };//必须是有序的数据
	//int n = 0;
	//printf("请输入你要查找的数字:");
	//scanf("%d",&n);
	//int sz = sizeof(arr) / sizeof(arr[0]);
	//int left = 0;
	//int right = sz - 1;
	//int flag = 0;//假设没找到
	//while (left <= right)
	//{
	//	int mid = left + (right - left) / 2;
	//	if (arr[mid] == n)
	//	{
	//		printf("恭喜你找到了，下标是:%d", mid);
	//		flag = 1;
	//		break;
	//	}
	//	else if (arr[mid] < n)
	//	{
	//		left = mid + 1;
	//	}
	//	else if (arr[mid] > n)
	//	{
	//		right = mid - 1;
	//	}
	//}
	//if (flag == 0)
	//{
	//	printf("很遗憾没找到");
	//}


	
	
	
	return 0;
}